import url from "url";
import http from "http";

// socket  ->  req请求, res响应(客户端和服务端)
const server = http.createServer((req, res) => {
  // 客户端请求到来的时候会访问此回调

  // 处理请求
  console.log(req.method); // GET 大写的
  // GET(获取数据，幂等操作， 缓存，不会对服务端的数据进行额外的操作，url长度有限制) POST(增加， 数据放在请求体里，比放到url更安全) DELETE PUT
  // 可以根据请求方法对资源文件做不同的处理    get /user  post /user  delete /user  (restful风格)
  // restful风格 比较主流的 (服务端决定返回哪些内容)  graphql （客户端可以决定要哪些内容）
  // 请求资源路径的问题 url  协议://用户名:密码@域名：端口号"/资源路径?查询参数"#hash值
  // #hash值 代表前端路由，锚点 这个东西不是给服务器的，服务器无法获取。 前端hash路由不支持seo优化
  const { pathname, query } = url.parse(req.url, true);
  console.log(pathname, query);
  // console.log(
  //   url.parse("https://abc:123@baidu.com:8080/资源路径?查询参数=abc#hash值")
  // );
  console.log(req.httpVersion, req.httpVersionMajor);
  // ----------
  console.log(req.headers); // 全部小写
  // 内容协商 （压缩，缓存，请求的内容格式 。。。。） 在node中统一全部转化成小写

  // 内容
  const arr = [];
  req.on("data", function (chunk) {
    // push(内容)
    arr.push(chunk);
    console.log(chunk, 28);
  });

  req.on("end", function () {
    // push(null) 读流
    console.log(Buffer.concat(arr).toString()); // 客户端发送过来的请求
    console.log("end 一定会触发");
  });

  // 处理响应
  // HTTP/1/1 200 OK
  res.statusCode = 200;
  // res.statusMessage = "unx";
  // 1xx信息状态码:101 websocket的时候会触发 切换协议  需要升级成websocket协议
  // 2xx成功状态码: 200 成功  204 成功没有返回内容 206 分片传输 bytes-range
  // 3xx重定向状态码： 301 永久重定向 302 临时重定向  304 缓存，浏览器会查找缓存去
  // 4xx客户端错误： 400 客户端出错  401 未登录  403 登录无法访问 404 找不到  405方法不对
  // 5xx 服务端错误 ， 502 宕机  503 超载

  res.setHeader("a", 1);
  res.setHeader("b", 2);
  res.setHeader("C", 3); // 写入header

  // 结束响应主要是 buffer 、 string
  res.end(Buffer.from("ok")); // 挂掉
});

let port = 3000;
server.listen(port, function () {
  // 通过on绑定的事件，稍后重新监听成功后会执行此回调
  console.log("server start " + port);
});

server.on("error", function (err) {
  if (err.code === "EADDRINUSE") {
    server.listen(++port);
  }
});

// 1.本地开发 采用 nodemon 来监听代码变化自动重启
// 2.线上有pm2 服务端进程挂了，可以自动重启

// npm i nodemon -g
// nodemon + 文件名运行即可
